0. Analysis For What?

이번 분석은 cell type별로 어떤 regulation이 일어난 gene이 ASD에 주된 영향을 끼치는지 알아보고자 한다. 또한 cell type별로 top3 gene들을 선정하여, 각 gene들이 어떠한 특징을 가지고 있는지 그 양상을 살펴보고자 한다.

1. Data Loding

분석을 위해 Data-S4를 불러오고자 한다.

library(tidyverse)
library(readxl)
library(ggrepel)
library(ggplot2)
d4 <- read_xls("aav8130_Data-S4.xls")

2. Data Analysis & Transformation

먼저, 데이터를 바꾸기 전에 load된 data가 어떠한 형태를 띄고있는지 확인해보도록 하자.

head(d4)

이 dataset에서 먼저 cell type별로 보기 위해서 neuronal cell인지 nonneuronal cell인지 구분할 수 있는 column을 만들고, DEG의 달라진 expression정도를 보기 위해 Fold change값에 절댓값을 씌운 column을 추가할 것이다. 또한 절댓값을 씌운 것 때문에 upregulate 혹은 downregulate된 gene들의 구분이 어려워질 수 있으므로 어떤 방향으로 regulate가 일어났는지 표시할 수 있는 column을 만들고 cell type에 specific하게 발현하는 gene들은 따로 표시하려고 한다.

neuronal_cell <-  c("L2/3","L4","L5/6","L5/6-CC","IN-PV","IN-SST","IN-VIP","IN-SV2C","Neu-NRGN-I","Neu-NRGN-II","Neu-mat")
m_d4 <- d4 %>% 
  mutate(neuronal_or_nonneuronal = ifelse(d4$`Cell type` %in% neuronal_cell,'neuronal','non-neuronal'), 'abs Fold change'=abs(`Fold change`), regulating = ifelse(.$`Fold change`>0,'upregulate','downregulate')) %>%
  mutate(regulating = ifelse(`cell type-specific expression` == "yes", paste(regulating,"cell_type_specific",sep ="_"),regulating))
m_d4

3. Data Visualization & Analysis

변형한 dataset에서 bar plot을 통해 cell type 별로 어떠한 방향으로 regulate된 gene들의 발현량이 높은지, regulate 방향에 따라 절댓값이 씌워진 Fold change의 대푯값을 통해 확인하고자 한다.

대푯값을 설정하기 전에 절댓값을 씌운 Fold change값의 범위, 평균을 통해 절댓값을 씌운 Fold change의 분산을 살펴보고자 한다.

range(m_d4$`abs Fold change`)
[1] 0.1401016 0.8419946
mean(m_d4$`abs Fold change`)
[1] 0.2362021

넓은 범위에 비해 낮은 평균값을 보임을 통해 절댓값을 씌운 Fold change값에 outlier가 있음을 예측할 수 있다. 따라서 대푯값은 Median으로 설정하는 것이 바람직하다.

Median을 통해 plot을 그려보면 다음과 같다.

rm_d4 <- m_d4 %>% group_by(`Cell type`,regulating,neuronal_or_nonneuronal) %>% 
  summarize(mid = median(`abs Fold change`)) 
`summarise()` regrouping output by 'Cell type', 'regulating' (override with `.groups` argument)
rm_d4 %>%
  ggplot(aes(`Cell type`,mid,fill = regulating)) +
  geom_bar(stat = "identity") + 
  geom_label_repel(aes(label=mid),position = "stack") + 
  facet_grid(neuronal_or_nonneuronal~.,scale="free") + 
  theme_light() + 
  theme(legend.position = "top") +
  xlab("") +
  ylab("Sum Median of absolute Fold change") +
  coord_flip() +
  ggtitle("Median Of Absolute Fold Change")

우리는 이 plot에서 많은 문제점을 발견할 수 있다. 먼저 Median소숫점이 너무 길어서 파악에 어려움이 있다. 그리고 bar plot이 크기에 상관없이 뒤죽박죽 섞여 있기에 명확한 파악에 어려움을 준다. 또한 색에 가시성이 없어서 한눈에 들어오지 않는다. 마지막으로 cell type 전체적으로 "upregulate","downregulate","upregulate_cell_type_specific","downregulate_cell_type_specific"순서로 median 값이 커짐을 얼핏 확인할 수 있는데, 이것이 plot에 반영된다면 더욱 보기 좋은 plot이 될 것이다.

따라서 Median의 소숫점은 3자리까지 설정하고 bar plot을 크기 순서로 나열한 후 색을 재설정하고 factor function을 통해 regulation에 따른 absoulte fold change의 크기를 반영하여 다시 보도록 하겠다.

m_d4$regulating = factor(m_d4$regulating,levels = c("upregulate","downregulate","upregulate_cell_type_specific","downregulate_cell_type_specific"))

rm_d4 <- m_d4 %>% group_by(`Cell type`,regulating,neuronal_or_nonneuronal) %>% 
  summarize(mid = median(`abs Fold change`)) %>% 
  group_by(`Cell type`) %>% 
  mutate(mid_sum = sum(mid))
`summarise()` regrouping output by 'Cell type', 'regulating' (override with `.groups` argument)
rm_d4$mid <- round(rm_d4$mid,digits = 3)

rm_d4 %>%
  ggplot(aes(reorder(`Cell type`,mid_sum),mid,fill = regulating)) +
  geom_bar(stat = "identity") + 
  geom_label_repel(aes(label=mid),position = "stack") + 
  facet_grid(neuronal_or_nonneuronal~.,scale="free") + scale_fill_manual(breaks = c("upregulate","downregulate","upregulate_cell_type_specific","downregulate_cell_type_specific"), values = c("#82E0AA","#85C1E9","#A569BD","#FF00FF")) + 
  theme_light() + 
  theme(legend.position = "top") +
  xlab("") +
  ylab("Sum Median Of Absolute Fold Change") +
  coord_flip() +
  ggtitle("Median Of Absolute Fold Change By Regulation")

이전보다 훨씬 깔끔하고 보기 좋은 plot이 완성되었다. 그렇다면, cell type과 regulating에 따른 gene들의 fold change는 어떠한 양상으로 나타나는지 violin plotpoint plot을 통해 살펴보자.(gene이 무수히 많기 때문에, cell type별로 가장 높은 fold change값을 보이는 gene 3개만 labeling하도록 하겠다.)

t <- m_d4  %>% select(`Cell type`,`Gene name`,regulating,`abs Fold change`) %>% group_by(`Cell type`) %>% top_n(3) 
Selecting by abs Fold change
top3 <- t %>% pull()

m_d4 %>% 
  ggplot(aes(`Cell type`,`abs Fold change`)) + 
  geom_violin(alpha=0.3) + 
  geom_label_repel(aes(label = ifelse(`abs Fold change` %in% top3,`Gene name`,""),color= regulating),nudge_x = 0.5, size = 2,force =0.1) + 
  geom_point(aes(color=regulating),size=1) + 
  facet_grid(neuronal_or_nonneuronal~.,scales="free" ) + 
  xlab("") +
  ylab("Absolute Fold Change") + 
  scale_color_manual(breaks = c("upregulate","downregulate","upregulate_cell_type_specific","downregulate_cell_type_specific"), values = c("#82E0AA","#85C1E9","#A569BD","#FF00FF")) + 
  theme_light() + 
  theme(legend.position = "top", legend.text = element_text(size="8")) + 
  coord_flip() +
  ggtitle("Absolute Fold Change Of Genes By Regulation")

예상대로 downregulate_cell_type_specificupregulate_cell_type_specific에 해당하는 gene들이 cell type 전반에 걸쳐 높은 수치를 보인다. 그렇다면 cowplot을 통해 한눈에 plot을 봐보자.

library(cowplot)
plot_grid(rm_d4 %>%
  ggplot(aes(reorder(`Cell type`,mid_sum),mid,fill = regulating)) +
  geom_bar(stat = "identity") + 
  geom_label_repel(aes(label=mid),position = "stack",size=6) + 
  facet_grid(neuronal_or_nonneuronal~.,scale="free") + scale_fill_manual(breaks = c("upregulate","downregulate","upregulate_cell_type_specific","downregulate_cell_type_specific"), values = c("#82E0AA","#85C1E9","#A569BD","#FF00FF")) + 
  theme_light() + 
  theme(legend.position = "top", legend.text = element_text(size="13"), strip.text.y = element_text(size = 15),axis.text = element_text(size = 20)) +
  xlab("") +
  ylab("Sum Median Of Absolute Fold Change") +
  coord_flip(),
  m_d4 %>% 
  ggplot(aes(`Cell type`,`abs Fold change`)) + 
  geom_violin(alpha=0.3) + 
  geom_label_repel(aes(label = ifelse(`abs Fold change` %in% top3,`Gene name`,""),color= regulating),nudge_x = 0.5, size = 6,force =0.1) + 
  geom_point(aes(color=regulating),size=4) + 
  facet_grid(neuronal_or_nonneuronal~.,scales="free") + 
  xlab("") +
  ylab("Absolute Fold Change") + 
  scale_color_manual(breaks = c("upregulate","downregulate","upregulate_cell_type_specific","downregulate_cell_type_specific"), values = c("#82E0AA","#85C1E9","#A569BD","#FF00FF")) + 
  theme_light() + 
  theme(legend.position = "top", legend.text = element_text(size="13"), legend.title = element_blank(), strip.text.y = element_text(size = 15),axis.text = element_text(size = 20)) + 
  coord_flip()) 

plot이 깔끔하게 그려졌지만, cell type의 순서가 서로 달라서 비교하며 plot을 볼 수 없다. 즉, 그저 cowplot통해 plot을 붙여놓은 것 뿐이다. 따라서 factorfunction을 통해 두 plot의 cell type 순서를 같게 조정하고, 제목을 붙여넣은 후 다시 봐보도록 하자.

m_d4$`Cell type` = factor(m_d4$`Cell type`,levels = c("AST-FB","Oligodendrocytes","Microglia","OPC","Endothelial","AST-PP","L5/6-CC","L5/6","L4","L2/3","IN-PV","IN-SV2C","IN-SST","Neu-mat","IN-VIP","Neu-NRGN-II","Neu-NRGN-I"))

plot <- plot_grid(rm_d4 %>%
  ggplot(aes(reorder(`Cell type`,mid_sum),mid,fill = regulating)) +
  geom_bar(stat = "identity") + 
  geom_label_repel(aes(label=mid),position = "stack",size=6) + 
  facet_grid(neuronal_or_nonneuronal~.,scale="free") + scale_fill_manual(breaks = c("upregulate","downregulate","upregulate_cell_type_specific","downregulate_cell_type_specific"), values = c("#82E0AA","#85C1E9","#A569BD","#FF00FF")) + 
  theme_light() + 
  theme(legend.position = "top", legend.text = element_text(size="13"), strip.text.y = element_text(size = 15),axis.text = element_text(size = 20)) +
  xlab("") +
  ylab("Sum Median Of Absolute Fold Change") +
  coord_flip(),
  m_d4 %>% 
  ggplot(aes(`Cell type`,`abs Fold change`)) + 
  geom_violin(alpha=0.3) + 
  geom_label_repel(aes(label = ifelse(`abs Fold change` %in% top3,`Gene name`,""),color= regulating),nudge_x = 0.5, size = 6,force =0.1) + 
  geom_point(aes(color=regulating),size=4) + 
  facet_grid(neuronal_or_nonneuronal~.,scales="free") + 
  xlab("") +
  ylab("Absolute Fold Change") + 
  scale_color_manual(breaks = c("upregulate","downregulate","upregulate_cell_type_specific","downregulate_cell_type_specific"), values = c("#82E0AA","#85C1E9","#A569BD","#FF00FF")) + 
  theme_light() + 
  theme(legend.position = "top", legend.text = element_text(size="13"), legend.title = element_blank(), strip.text.y = element_text(size = 15),axis.text = element_text(size = 20)) + 
  coord_flip()) 

title <- ggdraw() + 
  draw_label("Absolute Fold Change By Cell Type And Regulation",hjust=0,x=0,vjust=1,fontface = "bold",size=20) + theme(plot.margin = margin(0,0,0,7))
plot_grid(title,plot,ncol=1, rel_heights = c(0.05,1))

완성된 plot의 모습이다. 우리는 두 plot이 비슷한 양상을 보임을 알 수 있다. 즉, cell type에 따라 absolute fold change의 median값이 높은 regulation이 실제로도 높은 수치로 나타남을 확인할 수 있다.

나는 Top3 gene들 중에서 높은 비중으로 관찰되었던 regulation인 downregulate cell type specificupregulate cell type specific에 해당하는 gene들이 어떤 gene인지 분석해보고자 한다.

먼저 위의 조건을 충족시키는 gene들을 살펴보자.

t %>% 
  group_by(`Cell type`) %>%
  filter(regulating %in% c("downregulate_cell_type_specific","upregulate_cell_type_specific"))

Neuronal Cell

Neu-NRGN-I

CFL1 : cofilin 1 [Source:HGNC Symbol;Acc:HGNC:1874], downregulate_cell_type_specific

Sources Search Human Gene, “CFL1”

MAPK1 : mitogen-activated protein kinase 1 [Source:HGNC Symbol;Acc:HGNC:6871], upregulate_cell_type_specific

Sources Search Human Gene, “MAPK1”

Neu-NRGN-II

BEX1 : brain expressed X-linked 1 [Source:HGNC Symbol;Acc:HGNC:1036], downregulate_cell_type_specific

Sources Search Human Gene, “BEX1”

NGFRAP1 : brain expressed X-linked 3 [Source:HGNC Symbol;Acc:HGNC:13388], downregulate_cell_type_specific

Sources Search Human Gene, “NGFRAP1”

PPP3CA : protein phosphatase 3 catalytic subunit alpha [Source:HGNC Symbol;Acc:HGNC:9314], upregulate_cell_type_specific

Sources Search Human Gene, “PPP3CA”

IN-PV

GRIA4 : glutamate ionotropic receptor AMPA type subunit 4 [Source:HGNC Symbol;Acc:HGNC:4574], upregulate_cell_type_specific

Sources Search Human Gene, “GRIA4”

CNTN5 : contactin 5 [Source:HGNC Symbol;Acc:HGNC:2175], upregulate_cell_type_specific

Sources Search Human Gene, “CNTN5”

IN-SST

MGAT4C : MGAT4 family member C [Source:HGNC Symbol;Acc:HGNC:30871], upregulate_cell_type_specific

Sources Search Human Gene, “MGAT4C”

RALYL : RALY RNA binding protein like [Source:HGNC Symbol;Acc:HGNC:27036], upregulate_cell_type_specific

Sources Search Human Gene, “RALYL”

Non-Neuronal Cell

Microglia

USP53 : ubiquitin specific peptidase 53 [Source:HGNC Symbol;Acc:HGNC:29255], upregulate_cell_type_specific

Sources Search Human Gene, “USP53”

FOXP2 : forkhead box P2 [Source:HGNC Symbol;Acc:HGNC:13875], upregulate_cell_type_specific

Sources Search Human Gene, “FOXP2”

AST-PP

PTGDS : prostaglandin D2 synthase [Source:HGNC Symbol;Acc:HGNC:9592], downregulate_cell_type_specific

Sources Search Human Gene, “PTGDS”

DLC1 : DLC1 Rho GTPase activating protein [Source:HGNC Symbol;Acc:HGNC:2897], upregulate_cell_type_specific

Sources Search Human Gene, “DLC1”

GABRB1 : gamma-aminobutyric acid type A receptor subunit beta1 [Source:HGNC Symbol;Acc:HGNC:4081], upregulate_cell_type_specific

Sources Search Human Gene, “GABRB1”

AST-FB

GABRB1 : gamma-aminobutyric acid type A receptor subunit beta1 [Source:HGNC Symbol;Acc:HGNC:4081], upregulate_cell_type_specific

Sources Search Human Gene, “GABRB1”

Oligodendrocytes

ABCA2 : ATP binding cassette subfamily A member 2 [Source:HGNC Symbol;Acc:HGNC:32], downregulate_cell_type_specific

Sources Search Human Gene, “ABCA2”

PTGDS : prostaglandin D2 synthase [Source:HGNC Symbol;Acc:HGNC:9592], downregulate_cell_type_specific

Sources Search Human Gene, “PTGDS”

PTMA : prothymosin alpha [Source:HGNC Symbol;Acc:HGNC:9623], downregulate_cell_type_specific

Sources Search Human Gene, “PTMA”

OPC

OLIG1 : oligodendrocyte transcription factor 1 [Source:HGNC Symbol;Acc:HGNC:16983], downregulate_cell_type_specific

Sources Search Human Gene, “OLIG1”

Endothelial

LAMA2 : laminin subunit alpha 2 [Source:HGNC Symbol;Acc:HGNC:6482], upregulate_cell_type_specific

Sources Search Human Gene, “LAMA2”

4. Conclusion & Expectation

먼저 neuronal cell에 해당하는 gene들을 살펴보면 흥미로운 부분이 많다.

대다수 Gene들이 뇌신경 발달장애와 연관이 있다는 점이 그것이다.

downregulate된 CFL1은 cofilin을 만들어내는 gene이다. cofilin은 actin filament와 상호작용하여 neuron 축삭돌기의 성장속도와 방향조절을 한다. 또한, 이것의 신속한 합성이 정확한 시냅스를 형성하도록 도우며, 뇌신경 발달장애를 막는데 도움을 준다. 외에도, upregulate된 PPP3CA,GRIA4,CNTN5은 모두 뇌신경 발달장애 질병과 관련이 있다.

다음으로 non neuronal cell에 해당하는 gene들을 살펴보자.

FOXP2, PTGDS와 같이 뇌에서 중요한 역할을 수행하는 gene들도 있고, GABRB1처럼 신경질환에 크게 관여하는 gene들도 있음을 알 수 있다.

우리는 위와 같은 결과를 통해서 ASD에 관여하는 gene들은 대다수 pleiotropic함을 유추할 수 있다. 또한 BEX1이나 NGFRAP1와 같이 x염색체에 link된 유전자들의 높은 downregulation을 통해 ASD와 sex에 대한 상관관계성도 논의해볼 수 있을 것이라고 예측해볼 수 있다.

5. Reference

  1. Choi JH, Wang W, Park D, Kim SH, Kim KT, Min KT. IRES-mediated translation of cofilin regulates axonal growth cone extension and turning. EMBO J. 2018 Mar 1;37(5):e95266. doi: 10.15252/embj.201695266. Epub 2018 Feb 12. PMID: 29440227; PMCID: PMC5830920.

  2. Kleijer, Kristel & Zuko, Amila & Shimoda, Yasushi & Watanabe, Kazutada & Burbach, J. (2015). Contactin-5 expression during development and wiring of the thalamocortical system. Neuroscience. 310. 10.1016/j.neuroscience.2015.09.039.

  3. Vasquez, Kizzy & Kuizon, Salomon & Junaid, Mohammed & El Idrissi, Abdeslem. (2013). The effect of folic acid on GABAA-B1 receptor subunit. Advances in experimental medicine and biology. 775. 101-9. 10.1007/978-1-4614-6130-2_8.

LS0tCnRpdGxlOiAiQW5hbHlzaXMgT2YgVG9wIDMgR2VuZXMgVGhhdCBBZmZlY3QgQVNEIEJ5IENlbGwgVHlwZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKIyMgKiowLiBBbmFseXNpcyBGb3IgV2hhdD8qKgrsnbTrsogg67aE7ISd7J2AIGNlbGwgdHlwZeuzhOuhnCDslrTrlqQgcmVndWxhdGlvbuydtCDsnbzslrTrgpwgZ2VuZeydtCBBU0Tsl5Ag7KO865CcIOyYge2WpeydhCDrgbzsuZjripTsp4Ag7JWM7JWE67O06rOg7J6QIO2VnOuLpC4K65iQ7ZWcIGNlbGwgdHlwZeuzhOuhnCB0b3AzIGdlbmXrk6TsnYQg7ISg7KCV7ZWY7JesLCDqsIEgZ2VuZeuTpOydtCDslrTrlqDtlZwg7Yq57KeV7J2EIOqwgOyngOqzoCDsnojripTsp4Ag6re4IOyWkeyDgeydhCDsgrTtjrTrs7Tqs6DsnpAg7ZWc64ukLgoKIyMgKioxLiBEYXRhIExvZGluZyoqCgrrtoTshJ3snYQg7JyE7ZW0IERhdGEtUzTrpbwg67aI65+s7Jik6rOg7J6QIO2VnOuLpC4KYGBge3J9CmxpYnJhcnkodGlkeXZlcnNlKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShnZ3JlcGVsKQpsaWJyYXJ5KGdncGxvdDIpCmQ0IDwtIHJlYWRfeGxzKCJhYXY4MTMwX0RhdGEtUzQueGxzIikKYGBgCgojIyAqKjIuIERhdGEgQW5hbHlzaXMgJiBUcmFuc2Zvcm1hdGlvbioqCgrrqLzsoIAsIOuNsOydtO2EsOulvCDrsJTqvrjquLAg7KCE7JeQIGxvYWTrkJwgZGF0YeqwgCDslrTrlqDtlZwg7ZiV7YOc66W8IOudhOqzoOyeiOuKlOyngCDtmZXsnbjtlbTrs7Trj4TroZ0g7ZWY7J6QLgpgYGB7cn0KaGVhZChkNCkKYGBgCuydtCBkYXRhc2V07JeQ7IScIOuovOyggCBjZWxsIHR5cGXrs4TroZwg67O06riwIOychO2VtOyEnCBuZXVyb25hbCBjZWxs7J247KeAIG5vbm5ldXJvbmFsIGNlbGzsnbjsp4Ag6rWs67aE7ZWgIOyImCDsnojripQgY29sdW1u7J2EIOunjOuTpOqzoCwgREVH7J2YIOuLrOudvOynhCBleHByZXNzaW9u7KCV64+E66W8IOuztOq4sCDsnITtlbQgRm9sZCBjaGFuZ2XqsJLsl5Ag7KCI64yT6rCS7J2EIOyUjOyatCBjb2x1bW7snYQg7LaU6rCA7ZWgIOqyg+ydtOuLpC4g65iQ7ZWcIOygiOuMk+qwkuydhCDslIzsmrQg6rKDIOuVjOusuOyXkCB1cHJlZ3VsYXRlIO2YueydgCBkb3ducmVndWxhdGXrkJwgZ2VuZeuTpOydmCDqtazrtoTsnbQg7Ja066Ck7JuM7KeIIOyImCDsnojsnLzrr4DroZwg7Ja065akIOuwqe2WpeycvOuhnCByZWd1bGF0ZeqwgCDsnbzslrTrgqzripTsp4Ag7ZGc7Iuc7ZWgIOyImCDsnojripQgY29sdW1u7J2EIOunjOuTpOqzoCBjZWxsIHR5cGXsl5Agc3BlY2lmaWPtlZjqsowg67Cc7ZiE7ZWY64qUIGdlbmXrk6TsnYAg65Sw66GcIO2RnOyLnO2VmOugpOqzoCDtlZzri6QuCmBgYHtyfQpuZXVyb25hbF9jZWxsIDwtICBjKCJMMi8zIiwiTDQiLCJMNS82IiwiTDUvNi1DQyIsIklOLVBWIiwiSU4tU1NUIiwiSU4tVklQIiwiSU4tU1YyQyIsIk5ldS1OUkdOLUkiLCJOZXUtTlJHTi1JSSIsIk5ldS1tYXQiKQptX2Q0IDwtIGQ0ICU+JSAKICBtdXRhdGUobmV1cm9uYWxfb3Jfbm9ubmV1cm9uYWwgPSBpZmVsc2UoZDQkYENlbGwgdHlwZWAgJWluJSBuZXVyb25hbF9jZWxsLCduZXVyb25hbCcsJ25vbi1uZXVyb25hbCcpLCAnYWJzIEZvbGQgY2hhbmdlJz1hYnMoYEZvbGQgY2hhbmdlYCksIHJlZ3VsYXRpbmcgPSBpZmVsc2UoLiRgRm9sZCBjaGFuZ2VgPjAsJ3VwcmVndWxhdGUnLCdkb3ducmVndWxhdGUnKSkgJT4lCiAgbXV0YXRlKHJlZ3VsYXRpbmcgPSBpZmVsc2UoYGNlbGwgdHlwZS1zcGVjaWZpYyBleHByZXNzaW9uYCA9PSAieWVzIiwgcGFzdGUocmVndWxhdGluZywiY2VsbF90eXBlX3NwZWNpZmljIixzZXAgPSJfIikscmVndWxhdGluZykpCm1fZDQKYGBgCgojIyAqKjMuIERhdGEgVmlzdWFsaXphdGlvbiAmIEFuYWx5c2lzKioKCuuzgO2Yle2VnCBkYXRhc2V07JeQ7IScIGBiYXIgcGxvdGDsnYQg7Ya17ZW0IGNlbGwgdHlwZSDrs4TroZwg7Ja065ag7ZWcIOuwqe2WpeycvOuhnCByZWd1bGF0ZeuQnCBnZW5l65Ok7J2YIOuwnO2YhOufieydtCDrhpLsnYDsp4AsIHJlZ3VsYXRlIOuwqe2WpeyXkCDrlLDrnbwg7KCI64yT6rCS7J20IOyUjOybjOynhCBGb2xkIGNoYW5nZeydmCAqKuuMgO2Rr+qwkioq7J2EIO2Gte2VtCDtmZXsnbjtlZjqs6DsnpAg7ZWc64ukLgoKKirrjIDtka/qsJIqKuydhCDshKTsoJXtlZjquLAg7KCE7JeQIOygiOuMk+qwkuydhCDslIzsmrQgRm9sZCBjaGFuZ2XqsJLsnZgg67KU7JyELCDtj4nqt6DsnYQg7Ya17ZW0IOygiOuMk+qwkuydhCDslIzsmrQgRm9sZCBjaGFuZ2XsnZgg67aE7IKw7J2EIOyCtO2OtOuztOqzoOyekCDtlZzri6QuCmBgYHtyfQpyYW5nZShtX2Q0JGBhYnMgRm9sZCBjaGFuZ2VgKQptZWFuKG1fZDQkYGFicyBGb2xkIGNoYW5nZWApCmBgYAoK64ST7J2AIOuylOychOyXkCDruYTtlbQg64Ku7J2AIO2Pieq3oOqwkuydhCDrs7TsnoTsnYQg7Ya17ZW0IOygiOuMk+qwkuydhCDslIzsmrQgRm9sZCBjaGFuZ2XqsJLsl5Agb3V0bGllcuqwgCDsnojsnYzsnYQg7JiI7Lih7ZWgIOyImCDsnojri6QuIOuUsOudvOyEnCDrjIDtka/qsJLsnYAgKipNZWRpYW4qKuycvOuhnCDshKTsoJXtlZjripQg6rKD7J20IOuwlOuejOynge2VmOuLpC4KCioqTWVkaWFuKirsnYQg7Ya17ZW0IHBsb3TsnYQg6re466Ck67O066m0IOuLpOydjOqzvCDqsJnri6QuCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD02fQpybV9kNCA8LSBtX2Q0ICU+JSBncm91cF9ieShgQ2VsbCB0eXBlYCxyZWd1bGF0aW5nLG5ldXJvbmFsX29yX25vbm5ldXJvbmFsKSAlPiUgCiAgc3VtbWFyaXplKG1pZCA9IG1lZGlhbihgYWJzIEZvbGQgY2hhbmdlYCkpIAoKcm1fZDQgJT4lCiAgZ2dwbG90KGFlcyhgQ2VsbCB0eXBlYCxtaWQsZmlsbCA9IHJlZ3VsYXRpbmcpKSArCiAgZ2VvbV9iYXIoc3RhdCA9ICJpZGVudGl0eSIpICsgCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWw9bWlkKSxwb3NpdGlvbiA9ICJzdGFjayIpICsgCiAgZmFjZXRfZ3JpZChuZXVyb25hbF9vcl9ub25uZXVyb25hbH4uLHNjYWxlPSJmcmVlIikgKyAKICB0aGVtZV9saWdodCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIpICsKICB4bGFiKCIiKSArCiAgeWxhYigiU3VtIE1lZGlhbiBvZiBhYnNvbHV0ZSBGb2xkIGNoYW5nZSIpICsKICBjb29yZF9mbGlwKCkgKwogIGdndGl0bGUoIk1lZGlhbiBPZiBBYnNvbHV0ZSBGb2xkIENoYW5nZSIpCmBgYAoK7Jqw66as64qUIOydtCBwbG907JeQ7IScIOunjuydgCDrrLjsoJzsoJDsnYQg67Cc6rKs7ZWgIOyImCDsnojri6QuIOuovOyggCAqKk1lZGlhbioq7J2YICrshozsiKvsoJAq7J20IOuEiOustCDquLjslrTshJwg7YyM7JWF7JeQIOyWtOugpOybgOydtCDsnojri6QuIOq3uOumrOqzoCBgYmFyIHBsb3Rg7J20IO2BrOq4sOyXkCDsg4HqtIDsl4bsnbQg65Kk7KO967CV7KO9IOyEnuyXrCDsnojquLDsl5Ag66qF7ZmV7ZWcIO2MjOyVheyXkCDslrTroKTsm4DsnYQg7KSA64ukLiDrmJDtlZwg7IOJ7JeQIOqwgOyLnOyEseydtCDsl4bslrTshJwg7ZWc64iI7JeQIOuTpOyWtOyYpOyngCDslYrripTri6QuIOuniOyngOunieycvOuhnCBjZWxsIHR5cGUg7KCE7LK07KCB7Jy866GcIGAidXByZWd1bGF0ZSIsImRvd25yZWd1bGF0ZSIsInVwcmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljIiwiZG93bnJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYyJg7Iic7ISc66GcIG1lZGlhbiDqsJLsnbQg7Luk7KeQ7J2EIOyWvO2VjyDtmZXsnbjtlaAg7IiYIOyeiOuKlOuNsCwg7J206rKD7J20IHBsb3Tsl5Ag67CY7JiB65Cc64uk66m0IOuNlOyasSDrs7TquLAg7KKL7J2AIHBsb3TsnbQg65CgIOqyg+ydtOuLpC4KCuuUsOudvOyEnCAqKk1lZGlhbioq7J2YIOyGjOyIq+ygkOydgCAz7J6Q66as6rmM7KeAIOyEpOygle2VmOqzoCBgYmFyIHBsb3Rg7J2EIO2BrOq4sCDsiJzshJzroZwg64KY7Je07ZWcIO2bhCDsg4nsnYQg7J6s7ISk7KCV7ZWY6rOgIGBmYWN0b3JgIGZ1bmN0aW9u7J2EIO2Gte2VtCByZWd1bGF0aW9u7JeQIOuUsOuluCBhYnNvdWx0ZSBmb2xkIGNoYW5nZeydmCDtgazquLDrpbwg67CY7JiB7ZWY7JesIOuLpOyLnCDrs7Trj4TroZ0g7ZWY6rKg64ukLgpgYGB7ciwgZmlnLndpZHRoPTYsIGZpZy5oZWlnaHQ9OH0KbV9kNCRyZWd1bGF0aW5nID0gZmFjdG9yKG1fZDQkcmVndWxhdGluZyxsZXZlbHMgPSBjKCJ1cHJlZ3VsYXRlIiwiZG93bnJlZ3VsYXRlIiwidXByZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMiLCJkb3ducmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljIikpCgpybV9kNCA8LSBtX2Q0ICU+JSBncm91cF9ieShgQ2VsbCB0eXBlYCxyZWd1bGF0aW5nLG5ldXJvbmFsX29yX25vbm5ldXJvbmFsKSAlPiUgCiAgc3VtbWFyaXplKG1pZCA9IG1lZGlhbihgYWJzIEZvbGQgY2hhbmdlYCkpICU+JSAKICBncm91cF9ieShgQ2VsbCB0eXBlYCkgJT4lIAogIG11dGF0ZShtaWRfc3VtID0gc3VtKG1pZCkpCgpybV9kNCRtaWQgPC0gcm91bmQocm1fZDQkbWlkLGRpZ2l0cyA9IDMpCgpybV9kNCAlPiUKICBnZ3Bsb3QoYWVzKHJlb3JkZXIoYENlbGwgdHlwZWAsbWlkX3N1bSksbWlkLGZpbGwgPSByZWd1bGF0aW5nKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIAogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsPW1pZCkscG9zaXRpb24gPSAic3RhY2siKSArIAogIGZhY2V0X2dyaWQobmV1cm9uYWxfb3Jfbm9ubmV1cm9uYWx+LixzY2FsZT0iZnJlZSIpICsgc2NhbGVfZmlsbF9tYW51YWwoYnJlYWtzID0gYygidXByZWd1bGF0ZSIsImRvd25yZWd1bGF0ZSIsInVwcmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljIiwiZG93bnJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYyIpLCB2YWx1ZXMgPSBjKCIjODJFMEFBIiwiIzg1QzFFOSIsIiNBNTY5QkQiLCIjRkYwMEZGIikpICsgCiAgdGhlbWVfbGlnaHQoKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJ0b3AiKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlN1bSBNZWRpYW4gT2YgQWJzb2x1dGUgRm9sZCBDaGFuZ2UiKSArCiAgY29vcmRfZmxpcCgpICsKICBnZ3RpdGxlKCJNZWRpYW4gT2YgQWJzb2x1dGUgRm9sZCBDaGFuZ2UgQnkgUmVndWxhdGlvbiIpCmBgYArsnbTsoITrs7Tri6Qg7Zuo7JSsIOq5lOuBlO2VmOqzoCDrs7TquLAg7KKL7J2AIHBsb3TsnbQg7JmE7ISx65CY7JeI64ukLiDqt7jroIfri6TrqbQsIGNlbGwgdHlwZeqzvCByZWd1bGF0aW5n7JeQIOuUsOuluCBnZW5l65Ok7J2YIGZvbGQgY2hhbmdl64qUIOyWtOuWoO2VnCDslpHsg4HsnLzroZwg64KY7YOA64KY64qU7KeAIGB2aW9saW4gcGxvdGDqs7wgYHBvaW50IHBsb3Rg7J2EIO2Gte2VtCDsgrTtjrTrs7TsnpAuKGdlbmXsnbQg66y07IiY7Z6IIOunjuq4sCDrlYzrrLjsl5AsIGNlbGwgdHlwZeuzhOuhnCDqsIDsnqUg64aS7J2AIGZvbGQgY2hhbmdl6rCS7J2EIOuztOydtOuKlCBnZW5lIDPqsJzrp4wgbGFiZWxpbmftlZjrj4TroZ0g7ZWY6rKg64ukLikKCmBgYHtyLCBmaWcud2lkdGg9NiwgZmlnLmhlaWdodD02fQp0IDwtIG1fZDQgICU+JSBzZWxlY3QoYENlbGwgdHlwZWAsYEdlbmUgbmFtZWAscmVndWxhdGluZyxgYWJzIEZvbGQgY2hhbmdlYCkgJT4lIGdyb3VwX2J5KGBDZWxsIHR5cGVgKSAlPiUgdG9wX24oMykgCnRvcDMgPC0gdCAlPiUgcHVsbCgpCgptX2Q0ICU+JSAKICBnZ3Bsb3QoYWVzKGBDZWxsIHR5cGVgLGBhYnMgRm9sZCBjaGFuZ2VgKSkgKyAKICBnZW9tX3Zpb2xpbihhbHBoYT0wLjMpICsgCiAgZ2VvbV9sYWJlbF9yZXBlbChhZXMobGFiZWwgPSBpZmVsc2UoYGFicyBGb2xkIGNoYW5nZWAgJWluJSB0b3AzLGBHZW5lIG5hbWVgLCIiKSxjb2xvcj0gcmVndWxhdGluZyksbnVkZ2VfeCA9IDAuNSwgc2l6ZSA9IDIsZm9yY2UgPTAuMSkgKyAKICBnZW9tX3BvaW50KGFlcyhjb2xvcj1yZWd1bGF0aW5nKSxzaXplPTEpICsgCiAgZmFjZXRfZ3JpZChuZXVyb25hbF9vcl9ub25uZXVyb25hbH4uLHNjYWxlcz0iZnJlZSIgKSArIAogIHhsYWIoIiIpICsKICB5bGFiKCJBYnNvbHV0ZSBGb2xkIENoYW5nZSIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKGJyZWFrcyA9IGMoInVwcmVndWxhdGUiLCJkb3ducmVndWxhdGUiLCJ1cHJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYyIsImRvd25yZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMiKSwgdmFsdWVzID0gYygiIzgyRTBBQSIsIiM4NUMxRTkiLCIjQTU2OUJEIiwiI0ZGMDBGRiIpKSArIAogIHRoZW1lX2xpZ2h0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0iOCIpKSArIAogIGNvb3JkX2ZsaXAoKSArCiAgZ2d0aXRsZSgiQWJzb2x1dGUgRm9sZCBDaGFuZ2UgT2YgR2VuZXMgQnkgUmVndWxhdGlvbiIpCmBgYArsmIjsg4HrjIDroZwgYGRvd25yZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWNg6rO8IGB1cHJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpY2Dsl5Ag7ZW064u57ZWY64qUIGdlbmXrk6TsnbQgY2VsbCB0eXBlIOyghOuwmOyXkCDqsbjss5Ag64aS7J2AIOyImOy5mOulvCDrs7Tsnbjri6QuIOq3uOugh+uLpOuptCBgY293cGxvdGDsnYQg7Ya17ZW0IO2VnOuIiOyXkCBwbG907J2EIOu0kOuztOyekC4KYGBge3IsIGZpZy53aWR0aD0xNSxmaWcuaGVpZ2h0PTEwfQpsaWJyYXJ5KGNvd3Bsb3QpCnBsb3RfZ3JpZChybV9kNCAlPiUKICBnZ3Bsb3QoYWVzKHJlb3JkZXIoYENlbGwgdHlwZWAsbWlkX3N1bSksbWlkLGZpbGwgPSByZWd1bGF0aW5nKSkgKwogIGdlb21fYmFyKHN0YXQgPSAiaWRlbnRpdHkiKSArIAogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsPW1pZCkscG9zaXRpb24gPSAic3RhY2siLHNpemU9NikgKyAKICBmYWNldF9ncmlkKG5ldXJvbmFsX29yX25vbm5ldXJvbmFsfi4sc2NhbGU9ImZyZWUiKSArIHNjYWxlX2ZpbGxfbWFudWFsKGJyZWFrcyA9IGMoInVwcmVndWxhdGUiLCJkb3ducmVndWxhdGUiLCJ1cHJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYyIsImRvd25yZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMiKSwgdmFsdWVzID0gYygiIzgyRTBBQSIsIiM4NUMxRTkiLCIjQTU2OUJEIiwiI0ZGMDBGRiIpKSArIAogIHRoZW1lX2xpZ2h0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0iMTMiKSwgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpICsKICB4bGFiKCIiKSArCiAgeWxhYigiU3VtIE1lZGlhbiBPZiBBYnNvbHV0ZSBGb2xkIENoYW5nZSIpICsKICBjb29yZF9mbGlwKCksCiAgbV9kNCAlPiUgCiAgZ2dwbG90KGFlcyhgQ2VsbCB0eXBlYCxgYWJzIEZvbGQgY2hhbmdlYCkpICsgCiAgZ2VvbV92aW9saW4oYWxwaGE9MC4zKSArIAogIGdlb21fbGFiZWxfcmVwZWwoYWVzKGxhYmVsID0gaWZlbHNlKGBhYnMgRm9sZCBjaGFuZ2VgICVpbiUgdG9wMyxgR2VuZSBuYW1lYCwiIiksY29sb3I9IHJlZ3VsYXRpbmcpLG51ZGdlX3ggPSAwLjUsIHNpemUgPSA2LGZvcmNlID0wLjEpICsgCiAgZ2VvbV9wb2ludChhZXMoY29sb3I9cmVndWxhdGluZyksc2l6ZT00KSArIAogIGZhY2V0X2dyaWQobmV1cm9uYWxfb3Jfbm9ubmV1cm9uYWx+LixzY2FsZXM9ImZyZWUiKSArIAogIHhsYWIoIiIpICsKICB5bGFiKCJBYnNvbHV0ZSBGb2xkIENoYW5nZSIpICsgCiAgc2NhbGVfY29sb3JfbWFudWFsKGJyZWFrcyA9IGMoInVwcmVndWxhdGUiLCJkb3ducmVndWxhdGUiLCJ1cHJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYyIsImRvd25yZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMiKSwgdmFsdWVzID0gYygiIzgyRTBBQSIsIiM4NUMxRTkiLCIjQTU2OUJEIiwiI0ZGMDBGRiIpKSArIAogIHRoZW1lX2xpZ2h0KCkgKyAKICB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAidG9wIiwgbGVnZW5kLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0iMTMiKSwgbGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLCBzdHJpcC50ZXh0LnkgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDE1KSxheGlzLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZSA9IDIwKSkgKyAKICBjb29yZF9mbGlwKCkpIApgYGAKcGxvdOydtCDquZTrgZTtlZjqsowg6re466Ck7KGM7KeA66eMLCBjZWxsIHR5cGXsnZgg7Iic7ISc6rCAIOyEnOuhnCDri6zrnbzshJwg67mE6rWQ7ZWY66mwIHBsb3TsnYQg67O8IOyImCDsl4bri6QuIOymiSwg6re47KCAIGBjb3dwbG90YO2Gte2VtCBwbG907J2EIOu2meyXrOuGk+ydgCDqsoMg67+Q7J2064ukLiDrlLDrnbzshJwgYGZhY3RvcmBmdW5jdGlvbuydhCDthrXtlbQg65GQIHBsb3TsnZggY2VsbCB0eXBlIOyInOyEnOulvCDqsJnqsowg7KGw7KCV7ZWY6rOgLCDsoJzrqqnsnYQg67aZ7Jes64Sj7J2AIO2bhCDri6Tsi5wg67SQ67O064+E66GdIO2VmOyekC4KCmBgYHtyLCBmaWcud2lkdGg9MTUsZmlnLmhlaWdodD0xMH0KbV9kNCRgQ2VsbCB0eXBlYCA9IGZhY3RvcihtX2Q0JGBDZWxsIHR5cGVgLGxldmVscyA9IGMoIkFTVC1GQiIsIk9saWdvZGVuZHJvY3l0ZXMiLCJNaWNyb2dsaWEiLCJPUEMiLCJFbmRvdGhlbGlhbCIsIkFTVC1QUCIsIkw1LzYtQ0MiLCJMNS82IiwiTDQiLCJMMi8zIiwiSU4tUFYiLCJJTi1TVjJDIiwiSU4tU1NUIiwiTmV1LW1hdCIsIklOLVZJUCIsIk5ldS1OUkdOLUlJIiwiTmV1LU5SR04tSSIpKQoKcGxvdCA8LSBwbG90X2dyaWQocm1fZDQgJT4lCiAgZ2dwbG90KGFlcyhyZW9yZGVyKGBDZWxsIHR5cGVgLG1pZF9zdW0pLG1pZCxmaWxsID0gcmVndWxhdGluZykpICsKICBnZW9tX2JhcihzdGF0ID0gImlkZW50aXR5IikgKyAKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbD1taWQpLHBvc2l0aW9uID0gInN0YWNrIixzaXplPTYpICsgCiAgZmFjZXRfZ3JpZChuZXVyb25hbF9vcl9ub25uZXVyb25hbH4uLHNjYWxlPSJmcmVlIikgKyBzY2FsZV9maWxsX21hbnVhbChicmVha3MgPSBjKCJ1cHJlZ3VsYXRlIiwiZG93bnJlZ3VsYXRlIiwidXByZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMiLCJkb3ducmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljIiksIHZhbHVlcyA9IGMoIiM4MkUwQUEiLCIjODVDMUU5IiwiI0E1NjlCRCIsIiNGRjAwRkYiKSkgKyAKICB0aGVtZV9saWdodCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9IjEzIiksIHN0cmlwLnRleHQueSA9IGVsZW1lbnRfdGV4dChzaXplID0gMTUpLGF4aXMudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMjApKSArCiAgeGxhYigiIikgKwogIHlsYWIoIlN1bSBNZWRpYW4gT2YgQWJzb2x1dGUgRm9sZCBDaGFuZ2UiKSArCiAgY29vcmRfZmxpcCgpLAogIG1fZDQgJT4lIAogIGdncGxvdChhZXMoYENlbGwgdHlwZWAsYGFicyBGb2xkIGNoYW5nZWApKSArIAogIGdlb21fdmlvbGluKGFscGhhPTAuMykgKyAKICBnZW9tX2xhYmVsX3JlcGVsKGFlcyhsYWJlbCA9IGlmZWxzZShgYWJzIEZvbGQgY2hhbmdlYCAlaW4lIHRvcDMsYEdlbmUgbmFtZWAsIiIpLGNvbG9yPSByZWd1bGF0aW5nKSxudWRnZV94ID0gMC41LCBzaXplID0gNixmb3JjZSA9MC4xKSArIAogIGdlb21fcG9pbnQoYWVzKGNvbG9yPXJlZ3VsYXRpbmcpLHNpemU9NCkgKyAKICBmYWNldF9ncmlkKG5ldXJvbmFsX29yX25vbm5ldXJvbmFsfi4sc2NhbGVzPSJmcmVlIikgKyAKICB4bGFiKCIiKSArCiAgeWxhYigiQWJzb2x1dGUgRm9sZCBDaGFuZ2UiKSArIAogIHNjYWxlX2NvbG9yX21hbnVhbChicmVha3MgPSBjKCJ1cHJlZ3VsYXRlIiwiZG93bnJlZ3VsYXRlIiwidXByZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMiLCJkb3ducmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljIiksIHZhbHVlcyA9IGMoIiM4MkUwQUEiLCIjODVDMUU5IiwiI0E1NjlCRCIsIiNGRjAwRkYiKSkgKyAKICB0aGVtZV9saWdodCgpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInRvcCIsIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemU9IjEzIiksIGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwgc3RyaXAudGV4dC55ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxNSksYXhpcy50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAyMCkpICsgCiAgY29vcmRfZmxpcCgpKSAKCnRpdGxlIDwtIGdnZHJhdygpICsgCiAgZHJhd19sYWJlbCgiQWJzb2x1dGUgRm9sZCBDaGFuZ2UgQnkgQ2VsbCBUeXBlIEFuZCBSZWd1bGF0aW9uIixoanVzdD0wLHg9MCx2anVzdD0xLGZvbnRmYWNlID0gImJvbGQiLHNpemU9MjApICsgdGhlbWUocGxvdC5tYXJnaW4gPSBtYXJnaW4oMCwwLDAsNykpCnBsb3RfZ3JpZCh0aXRsZSxwbG90LG5jb2w9MSwgcmVsX2hlaWdodHMgPSBjKDAuMDUsMSkpCgpgYGAK7JmE7ISx65CcIHBsb3TsnZgg66qo7Iq17J2064ukLiDsmrDrpqzripQg65GQIHBsb3TsnbQg67mE7Iq37ZWcIOyWkeyDgeydhCDrs7TsnoTsnYQg7JWMIOyImCDsnojri6QuIOymiSwgY2VsbCB0eXBl7JeQIOuUsOudvCBhYnNvbHV0ZSBmb2xkIGNoYW5nZeydmCBtZWRpYW7qsJLsnbQg64aS7J2AIHJlZ3VsYXRpb27snbQg7Iuk7KCc66Gc64+EIOuGkuydgCDsiJjsuZjroZwg64KY7YOA64Ko7J2EIO2ZleyduO2VoCDsiJgg7J6I64ukLgoK64KY64qUIGBUb3AzIGdlbmVg65OkIOykkeyXkOyEnCDrhpLsnYAg67mE7KSR7Jy866GcIOq0gOywsOuQmOyXiOuNmCByZWd1bGF0aW9u7J24IGBkb3ducmVndWxhdGUgY2VsbCB0eXBlIHNwZWNpZmljYOqzvCBgdXByZWd1bGF0ZSBjZWxsIHR5cGUgc3BlY2lmaWNg7JeQIO2VtOuLue2VmOuKlCBnZW5l65Ok7J20IOyWtOuWpCBnZW5l7J247KeAIOu2hOyEne2VtOuztOqzoOyekCDtlZzri6QuCgrrqLzsoIAg7JyE7J2YIOyhsOqxtOydhCDstqnsobHsi5ztgqTripQgZ2VuZeuTpOydhCDsgrTtjrTrs7TsnpAuCmBgYHtyfQp0ICU+JSAKICBncm91cF9ieShgQ2VsbCB0eXBlYCkgJT4lCiAgZmlsdGVyKHJlZ3VsYXRpbmcgJWluJSBjKCJkb3ducmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljIiwidXByZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMiKSkKYGBgCjxmb250IHNpemU9IjUiPioqTmV1cm9uYWwgQ2VsbCoqPC9mb250PgoKKipOZXUtTlJHTi1JKioKCj5DRkwxIDogY29maWxpbiAxIFtTb3VyY2U6SEdOQyBTeW1ib2w7QWNjOkhHTkM6MTg3NF0sIGRvd25yZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMKClNvdXJjZXMgW1NlYXJjaCBIdW1hbiBHZW5lLCAiQ0ZMMSJdKGh0dHBzOi8vYXNpYS5lbnNlbWJsLm9yZy9Ib21vX3NhcGllbnMvR2VuZS9TdW1tYXJ5P2RiPWNvcmU7Zz1FTlNHMDAwMDAxNzI3NTc7cj0xMTo2NTgyMzAyMi02NTg2MjAyNikKCj5NQVBLMSA6IG1pdG9nZW4tYWN0aXZhdGVkIHByb3RlaW4ga2luYXNlIDEgW1NvdXJjZTpIR05DIFN5bWJvbDtBY2M6SEdOQzo2ODcxXSwgdXByZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMKClNvdXJjZXMgW1NlYXJjaCBIdW1hbiBHZW5lLCAiTUFQSzEiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTAwMDMwO3I9MjI6MjE3NTk2NTctMjE4Njc2ODApCgoqKk5ldS1OUkdOLUlJKioKCj5CRVgxIDogYnJhaW4gZXhwcmVzc2VkIFgtbGlua2VkIDEgW1NvdXJjZTpIR05DIFN5bWJvbDtBY2M6SEdOQzoxMDM2XSwgZG93bnJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYwoKU291cmNlcyBbU2VhcmNoIEh1bWFuIEdlbmUsICJCRVgxIl0oaHR0cHM6Ly9hc2lhLmVuc2VtYmwub3JnL0hvbW9fc2FwaWVucy9HZW5lL1N1bW1hcnk/ZGI9Y29yZTtnPUVOU0cwMDAwMDEzMzE2OTtyPVg6MTAzMDYyNjUxLTEwMzA2NDE3MTt0PUVOU1QwMDAwMDM3MjcyOCkKCj5OR0ZSQVAxIDogYnJhaW4gZXhwcmVzc2VkIFgtbGlua2VkIDMgW1NvdXJjZTpIR05DIFN5bWJvbDtBY2M6SEdOQzoxMzM4OF0sIGRvd25yZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMKClNvdXJjZXMgW1NlYXJjaCBIdW1hbiBHZW5lLCAiTkdGUkFQMSJdKGh0dHBzOi8vYXNpYS5lbnNlbWJsLm9yZy9Ib21vX3NhcGllbnMvR2VuZS9TdW1tYXJ5P2RiPWNvcmU7Zz1FTlNHMDAwMDAxNjY2ODE7cj1YOjEwMzM3NjM5NS0xMDMzNzgxNjQpCgo+UFBQM0NBIDogcHJvdGVpbiBwaG9zcGhhdGFzZSAzIGNhdGFseXRpYyBzdWJ1bml0IGFscGhhIFtTb3VyY2U6SEdOQyBTeW1ib2w7QWNjOkhHTkM6OTMxNF0sIAl1cHJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYwoKU291cmNlcyBbU2VhcmNoIEh1bWFuIEdlbmUsICJQUFAzQ0EiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTM4ODE0O3I9NDoxMDEwMjM0MDktMTAxMzQ4Mjc4KQoKKipJTi1QVioqCgo+R1JJQTQgOiBnbHV0YW1hdGUgaW9ub3Ryb3BpYyByZWNlcHRvciBBTVBBIHR5cGUgc3VidW5pdCA0IFtTb3VyY2U6SEdOQyBTeW1ib2w7QWNjOkhHTkM6NDU3NF0sIHVwcmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljCgpTb3VyY2VzIFtTZWFyY2ggSHVtYW4gR2VuZSwgIkdSSUE0Il0oaHR0cHM6Ly9hc2lhLmVuc2VtYmwub3JnL0hvbW9fc2FwaWVucy9HZW5lL1N1bW1hcnk/ZGI9Y29yZTtnPUVOU0cwMDAwMDE1MjU3ODtyPTExOjEwNTYwOTk5NC0xMDU5ODIwOTIpCgo+Q05UTjUgOiBjb250YWN0aW4gNSBbU291cmNlOkhHTkMgU3ltYm9sO0FjYzpIR05DOjIxNzVdLCB1cHJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYwoKU291cmNlcyBbU2VhcmNoIEh1bWFuIEdlbmUsICJDTlRONSJdKGh0dHBzOi8vYXNpYS5lbnNlbWJsLm9yZy9Ib21vX3NhcGllbnMvR2VuZS9TdW1tYXJ5P2RiPWNvcmU7Zz1FTlNHMDAwMDAxNDk5NzI7cj0xMTo5OTAyMDk0OS0xMDAzNTg4ODUpCgoqKklOLVNTVCoqCgo+TUdBVDRDIDogTUdBVDQgZmFtaWx5IG1lbWJlciBDIFtTb3VyY2U6SEdOQyBTeW1ib2w7QWNjOkhHTkM6MzA4NzFdLCB1cHJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYwoKU291cmNlcyBbU2VhcmNoIEh1bWFuIEdlbmUsICJNR0FUNEMiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTgyMDUwO3I9MTI6ODU5NTU2NjYtODY4Mzg5MDQpCgo+UkFMWUwgOiBSQUxZIFJOQSBiaW5kaW5nIHByb3RlaW4gbGlrZSBbU291cmNlOkhHTkMgU3ltYm9sO0FjYzpIR05DOjI3MDM2XSwgdXByZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMKClNvdXJjZXMgW1NlYXJjaCBIdW1hbiBHZW5lLCAiUkFMWUwiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTg0NjcyO3I9ODo4NDE4Mjc4Ny04NDkyMTg0NCkKCjxmb250IHNpemU9IjUiPioqTm9uLU5ldXJvbmFsIENlbGwqKjwvZm9udD4KCioqTWljcm9nbGlhKioKCj5VU1A1MyA6IHViaXF1aXRpbiBzcGVjaWZpYyBwZXB0aWRhc2UgNTMgW1NvdXJjZTpIR05DIFN5bWJvbDtBY2M6SEdOQzoyOTI1NV0sIHVwcmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljCgpTb3VyY2VzIFtTZWFyY2ggSHVtYW4gR2VuZSwgIlVTUDUzIl0oaHR0cHM6Ly9hc2lhLmVuc2VtYmwub3JnL0hvbW9fc2FwaWVucy9HZW5lL1N1bW1hcnk/ZGI9Y29yZTtnPUVOU0cwMDAwMDE0NTM5MDtyPTQ6MTE5MjEyNTg3LTExOTI5NTUxNykKCj5GT1hQMiA6IGZvcmtoZWFkIGJveCBQMiBbU291cmNlOkhHTkMgU3ltYm9sO0FjYzpIR05DOjEzODc1XSwgdXByZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMKClNvdXJjZXMgW1NlYXJjaCBIdW1hbiBHZW5lLCAiRk9YUDIiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTI4NTczO3I9NzoxMTQwODYzMjctMTE0NjkzNzcyKQoKKipBU1QtUFAqKiAKCj5QVEdEUyA6IHByb3N0YWdsYW5kaW4gRDIgc3ludGhhc2UgW1NvdXJjZTpIR05DIFN5bWJvbDtBY2M6SEdOQzo5NTkyXSwgZG93bnJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYwkKClNvdXJjZXMgW1NlYXJjaCBIdW1hbiBHZW5lLCAiUFRHRFMiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTA3MzE3O3I9OToxMzY5NzUwOTItMTM2OTgxNzQyKQoKPkRMQzEgOiBETEMxIFJobyBHVFBhc2UgYWN0aXZhdGluZyBwcm90ZWluIFtTb3VyY2U6SEdOQyBTeW1ib2w7QWNjOkhHTkM6Mjg5N10sIHVwcmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljCgpTb3VyY2VzIFtTZWFyY2ggSHVtYW4gR2VuZSwgIkRMQzEiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTY0NzQxO3I9ODoxMzA4MzM2MS0xMzYwNDYxMCkKCj5HQUJSQjEgOiBnYW1tYS1hbWlub2J1dHlyaWMgYWNpZCB0eXBlIEEgcmVjZXB0b3Igc3VidW5pdCBiZXRhMSBbU291cmNlOkhHTkMgU3ltYm9sO0FjYzpIR05DOjQwODFdLCB1cHJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYwoKU291cmNlcyBbU2VhcmNoIEh1bWFuIEdlbmUsICJHQUJSQjEiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTYzMjg4O3I9NDo0Njk5MzcyMy00NzQyNjQ0NykKCioqQVNULUZCKioKCj5HQUJSQjEgOiBnYW1tYS1hbWlub2J1dHlyaWMgYWNpZCB0eXBlIEEgcmVjZXB0b3Igc3VidW5pdCBiZXRhMSBbU291cmNlOkhHTkMgU3ltYm9sO0FjYzpIR05DOjQwODFdLCB1cHJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYwoKU291cmNlcyBbU2VhcmNoIEh1bWFuIEdlbmUsICJHQUJSQjEiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTYzMjg4O3I9NDo0Njk5MzcyMy00NzQyNjQ0NykKCioqT2xpZ29kZW5kcm9jeXRlcyoqCgo+QUJDQTIgOiBBVFAgYmluZGluZyBjYXNzZXR0ZSBzdWJmYW1pbHkgQSBtZW1iZXIgMiBbU291cmNlOkhHTkMgU3ltYm9sO0FjYzpIR05DOjMyXSwgZG93bnJlZ3VsYXRlX2NlbGxfdHlwZV9zcGVjaWZpYwoKU291cmNlcyBbU2VhcmNoIEh1bWFuIEdlbmUsICJBQkNBMiJdKGh0dHBzOi8vYXNpYS5lbnNlbWJsLm9yZy9Ib21vX3NhcGllbnMvR2VuZS9TdW1tYXJ5P2RiPWNvcmU7Zz1FTlNHMDAwMDAxMDczMzE7cj05OjEzNzAwNzIzNC0xMzcwMjg5MjIpCgo+UFRHRFMgOiBwcm9zdGFnbGFuZGluIEQyIHN5bnRoYXNlIFtTb3VyY2U6SEdOQyBTeW1ib2w7QWNjOkhHTkM6OTU5Ml0sIGRvd25yZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMKClNvdXJjZXMgW1NlYXJjaCBIdW1hbiBHZW5lLCAiUFRHRFMiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTA3MzE3O3I9OToxMzY5NzUwOTItMTM2OTgxNzQyKQoKPlBUTUEgOiBwcm90aHltb3NpbiBhbHBoYSBbU291cmNlOkhHTkMgU3ltYm9sO0FjYzpIR05DOjk2MjNdLCBkb3ducmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljCgpTb3VyY2VzIFtTZWFyY2ggSHVtYW4gR2VuZSwgIlBUTUEiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTg3NTE0O3I9MjoyMzE3MDY4OTUtMjMxNzEzNTQxKQoKKipPUEMqKgoKPk9MSUcxIDogb2xpZ29kZW5kcm9jeXRlIHRyYW5zY3JpcHRpb24gZmFjdG9yIDEgW1NvdXJjZTpIR05DIFN5bWJvbDtBY2M6SEdOQzoxNjk4M10sIGRvd25yZWd1bGF0ZV9jZWxsX3R5cGVfc3BlY2lmaWMKClNvdXJjZXMgW1NlYXJjaCBIdW1hbiBHZW5lLCAiT0xJRzEiXShodHRwczovL2FzaWEuZW5zZW1ibC5vcmcvSG9tb19zYXBpZW5zL0dlbmUvU3VtbWFyeT9kYj1jb3JlO2c9RU5TRzAwMDAwMTg0MjIxO3I9MjE6MzMwNzAxNDEtMzMwNzI0MTMpCgoqKkVuZG90aGVsaWFsKioKCj5MQU1BMiA6IGxhbWluaW4gc3VidW5pdCBhbHBoYSAyIFtTb3VyY2U6SEdOQyBTeW1ib2w7QWNjOkhHTkM6NjQ4Ml0sIHVwcmVndWxhdGVfY2VsbF90eXBlX3NwZWNpZmljCgpTb3VyY2VzIFtTZWFyY2ggSHVtYW4gR2VuZSwgIkxBTUEyIl0oaHR0cHM6Ly9hc2lhLmVuc2VtYmwub3JnL0hvbW9fc2FwaWVucy9HZW5lL1N1bW1hcnk/ZGI9Y29yZTtnPUVOU0cwMDAwMDE5NjU2OTtyPTY6MTI4ODgzMTM4LTEyOTUxNjU2NikKCiMjICoqNC4gQ29uY2x1c2lvbiAmIEV4cGVjdGF0aW9uKioKCuuovOyggCBuZXVyb25hbCBjZWxs7JeQIO2VtOuLue2VmOuKlCBnZW5l65Ok7J2EIOyCtO2OtOuztOuptCDtnaXrr7jroZzsmrQg67aA67aE7J20IOunjuuLpC4gCgrrjIDri6TsiJggR2VuZeuTpOydtCAqKirrh4zsi6Dqsr0g67Cc64us7J6l7JWg7JmAIOyXsOq0gOydtCDsnojri6TripQg7KCQKioq7J20IOq3uOqyg+ydtOuLpC4gCgpkb3ducmVndWxhdGXrkJwgYENGTDFg7J2AIGNvZmlsaW7snYQg66eM65Ok7Ja064K064qUIGdlbmXsnbTri6QuIGNvZmlsaW7snYAgYWN0aW4gZmlsYW1lbnTsmYAg7IOB7Zi47J6R7Jqp7ZWY7JesIG5ldXJvbiDstpXsgq3rj4zquLDsnZgg7ISx7J6l7IaN64+E7JmAIOuwqe2WpeyhsOygiOydhCDtlZzri6QuIOuYkO2VnCwg7J206rKD7J2YIFvsi6Dsho3tlZwg7ZWp7ISx7J20IOygle2Zle2VnCDsi5zrg4XsiqTrpbwg7ZiV7ISx7ZWY64+E66GdIOuPhOyasOupsCwg64eM7Iug6rK9IOuwnOuLrOyepeyVoOulvCDrp4nripTrjbAg64+E7JuA7J2EIOykgOuLpC5dKGh0dHBzOi8vd3d3LmVtYm9wcmVzcy5vcmcvZG9pL2Z1bGwvMTAuMTUyNTIvZW1iai4yMDE2OTUyNjYpCuyZuOyXkOuPhCwgdXByZWd1bGF0ZeuQnCBbYFBQUDNDQWBdKGh0dHBzOi8vd3d3Lm1hbGFjYXJkcy5vcmcvY2FyZC9hcnRocm9ncnlwb3Npc19jbGVmdF9wYWxhdGVfY3Jhbmlvc3lub3N0b3Npc19hbmRfaW1wYWlyZWRfaW50ZWxsZWN0dWFsX2RldmVsb3BtZW50KSxbYEdSSUE0YF0oaHR0cHM6Ly93d3cubWFsYWNhcmRzLm9yZy9jYXJkL25ldXJvZGV2ZWxvcG1lbnRhbF9kaXNvcmRlcl93aXRoX29yX3dpdGhvdXRfc2VpenVyZXNfYW5kX2dhaXRfYWJub3JtYWxpdGllcyksW2BDTlRONWBdKGh0dHBzOi8vd3d3LnNjaWVuY2VkaXJlY3QuY29tL3NjaWVuY2UvYXJ0aWNsZS9hYnMvcGlpL1MwMzA2NDUyMjE1MDA4NTgxP3ZpYSUzRGlodWIp7J2AIOuqqOuRkCDrh4zsi6Dqsr0g67Cc64us7J6l7JWgIOyniOuzkeqzvCDqtIDroKjsnbQg7J6I64ukLgoK64uk7J2M7Jy866GcIG5vbiBuZXVyb25hbCBjZWxs7JeQIO2VtOuLue2VmOuKlCBnZW5l65Ok7J2EIOyCtO2OtOuztOyekC4KCltgRk9YUDJgXShodHRwczovL3d3dy5mcm9udGllcnNpbi5vcmcvYXJ0aWNsZXMvMTAuMzM4OS9mbmJlaC4yMDE2LjAwMTk3L2Z1bGwpLCBbYFBUR0RTYF0oaHR0cHM6Ly93d3cuZ2VuZWNhcmRzLm9yZy9jZ2ktYmluL2NhcmRkaXNwLnBsP2dlbmU9UFRHRFMp7JmAIOqwmeydtCDrh4zsl5DshJwg7KSR7JqU7ZWcIOyXre2VoOydhCDsiJjtlontlZjripQgZ2VuZeuTpOuPhCDsnojqs6AsIFtgR0FCUkIxYF0oaHR0cHM6Ly93d3cucmVzZWFyY2hnYXRlLm5ldC9wdWJsaWNhdGlvbi8yMzU0MjI4NzJfVGhlX2VmZmVjdF9vZl9mb2xpY19hY2lkX29uX0dBQkFBLUIxX3JlY2VwdG9yX3N1YnVuaXQp7LKY65+8IOyLoOqyveyniO2ZmOyXkCDtgazqsowg6rSA7Jes7ZWY64qUIGdlbmXrk6Trj4Qg7J6I7J2M7J2EIOyVjCDsiJgg7J6I64ukLgoK7Jqw66as64qUIOychOyZgCDqsJnsnYAg6rKw6rO866W8IO2Gte2VtOyEnCBBU0Tsl5Ag6rSA7Jes7ZWY64qUIGdlbmXrk6TsnYAg64yA64uk7IiYICpwbGVpb3Ryb3BpYyrtlajsnYQg7Jyg7LaU7ZWgIOyImCDsnojri6QuIOuYkO2VnCBgQkVYMWDsnbTrgpggYE5HRlJBUDFg7JmAIOqwmeydtCB47Je87IOJ7LK07JeQIGxpbmvrkJwg7Jyg7KCE7J6Q65Ok7J2YIOuGkuydgCBkb3ducmVndWxhdGlvbuydhCDthrXtlbQgQVNE7JmAIHNleOyXkCDrjIDtlZwg7IOB6rSA6rSA6rOE7ISx64+EIOuFvOydmO2VtOuzvCDsiJgg7J6I7J2EIOqyg+ydtOudvOqzoCDsmIjsuKHtlbTrs7wg7IiYIOyeiOuLpC4KCiMjICoqNS4gUmVmZXJlbmNlKioKCjEuIENob2kgSkgsIFdhbmcgVywgUGFyayBELCBLaW0gU0gsIEtpbSBLVCwgTWluIEtULiBJUkVTLW1lZGlhdGVkIHRyYW5zbGF0aW9uIG9mIGNvZmlsaW4gcmVndWxhdGVzIGF4b25hbCBncm93dGggY29uZSBleHRlbnNpb24gYW5kIHR1cm5pbmcuIEVNQk8gSi4gMjAxOCBNYXIgMTszNyg1KTplOTUyNjYuIGRvaTogMTAuMTUyNTIvZW1iai4yMDE2OTUyNjYuIEVwdWIgMjAxOCBGZWIgMTIuIFBNSUQ6IDI5NDQwMjI3OyBQTUNJRDogUE1DNTgzMDkyMC4KCjIuIEtsZWlqZXIsIEtyaXN0ZWwgJiBadWtvLCBBbWlsYSAmIFNoaW1vZGEsIFlhc3VzaGkgJiBXYXRhbmFiZSwgS2F6dXRhZGEgJiBCdXJiYWNoLCBKLiAoMjAxNSkuIENvbnRhY3Rpbi01IGV4cHJlc3Npb24gZHVyaW5nIGRldmVsb3BtZW50IGFuZCB3aXJpbmcgb2YgdGhlIHRoYWxhbW9jb3J0aWNhbCBzeXN0ZW0uIE5ldXJvc2NpZW5jZS4gMzEwLiAxMC4xMDE2L2oubmV1cm9zY2llbmNlLjIwMTUuMDkuMDM5LiAKCjMuIFZhc3F1ZXosIEtpenp5ICYgS3Vpem9uLCBTYWxvbW9uICYgSnVuYWlkLCBNb2hhbW1lZCAmIEVsIElkcmlzc2ksIEFiZGVzbGVtLiAoMjAxMykuIFRoZSBlZmZlY3Qgb2YgZm9saWMgYWNpZCBvbiBHQUJBQS1CMSByZWNlcHRvciBzdWJ1bml0LiBBZHZhbmNlcyBpbiBleHBlcmltZW50YWwgbWVkaWNpbmUgYW5kIGJpb2xvZ3kuIDc3NS4gMTAxLTkuIDEwLjEwMDcvOTc4LTEtNDYxNC02MTMwLTJfOC4gCgoKCgoKCgoKCgoKCgo=